import {app, BrowserWindow} from 'electron'
// import {createRequire} from 'node:module'
import {removeIpcHandlers, setupIpcHandlers} from './ipc'
import {closeDatabase, initDatabase} from './db'
import { storeManager } from './store'

// const require = createRequire(import.meta.url)
import './core'
import {windowManager} from "./core";
import { logger, LogCategory } from './logger';

// The built directory structure
//
// ├─┬─┬ dist
// │ │ └── index.html
// │ │
// │ ├─┬ dist-electron
// │ │ ├── main.js
// │ │ └── preload.mjs
// │

/**
 * 应用程序主入口
 * 负责初始化应用、设置事件监听和创建窗口
 */

// 只允许单实例运行
const singleInstanceLock = app.requestSingleInstanceLock();

if (!singleInstanceLock) {
  logger.info('Main', LogCategory.SYSTEM, '应用已经在运行中，退出当前实例');
  app.quit();
} else {
  // 当尝试启动第二个实例时，聚焦到第一个实例的窗口
  app.on('second-instance', () => {
    logger.info('Main', LogCategory.SYSTEM, '检测到第二个实例启动，激活主窗口');
    // 如果存在窗口，激活它
    const win = windowManager.getActiveWindow();
    if (win) {
      if (win.isMinimized()) win.restore();
      win.focus();
    } else {
      // 如果没有活动窗口，创建一个
      windowManager.createWindow();
    }
  });

  // 当所有窗口关闭时退出应用
  app.on('window-all-closed', () => {
    logger.info('Main', LogCategory.SYSTEM, '所有窗口已关闭');
    if (process.platform !== 'darwin') {
      logger.info('Main', LogCategory.SYSTEM, '非macOS平台，退出应用');
      app.quit();
      windowManager.clear();
    }
  });

  // 在macOS上，点击dock图标时如果没有窗口则创建新窗口
  app.on('activate', () => {
    logger.info('Main', LogCategory.SYSTEM, '应用被激活');
    if (BrowserWindow.getAllWindows().length === 0) {
      logger.info('Main', LogCategory.SYSTEM, '没有活动窗口，创建新窗口');
      windowManager.createWindow();
    }
  });

  // 应用就绪
  app.whenReady().then(async () => {
    try {
      logger.info('Main', LogCategory.SYSTEM, '应用准备就绪，初始化数据库');
      initDatabase();

      logger.info('Main', LogCategory.SYSTEM, '设置IPC处理程序');
      setupIpcHandlers();

      logger.info('Main', LogCategory.SYSTEM, '创建第一个窗口');
      windowManager.createWindow();
    } catch (error) {
      logger.error('Main', LogCategory.SYSTEM, '应用初始化失败', error);
      app.exit(1);
    }
  });

  // 应用退出前清理
  app.on('before-quit', () => {
    try {
      logger.info('Main', LogCategory.SYSTEM, '应用即将退出，清理资源');
      // 清理存储数据
      storeManager.cleanupStore();
      // 移除IPC处理器
      removeIpcHandlers();
      // 关闭数据库连接
      closeDatabase();
    } catch (error) {
      logger.error('Main', LogCategory.SYSTEM, '应用退出清理失败', error);
    }
    logger.info('Main', LogCategory.SYSTEM, '应用退出完成');
  });

  // 全局错误处理
  process.on('uncaughtException', (error) => {
    logger.error('Main', LogCategory.SYSTEM, '未捕获的异常', error);
  });

  process.on('unhandledRejection', (reason) => {
    logger.error('Main', LogCategory.SYSTEM, '未处理的Promise拒绝', reason);
  });
}
